// Copyright (C) 2016 the V8 project authors. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.
/*---
es6id: 14.1.6
description: >
  Default parameters' effect on function length
info: |
  Function length is counted by the non initialized parameters in the left.

  9.2.4 FunctionInitialize (F, kind, ParameterList, Body, Scope)

  [...]
  2. Let len be the ExpectedArgumentCount of ParameterList.
  3. Perform ! DefinePropertyOrThrow(F, "length", PropertyDescriptor{[[Value]]:
  [...]

  FormalsList : FormalParameter

    1. If HasInitializer of FormalParameter is true return 0
    2. Return 1.

  FormalsList : FormalsList , FormalParameter

    1. Let count be the ExpectedArgumentCount of FormalsList.
    2. If HasInitializer of FormalsList is true or HasInitializer of
    FormalParameter is true, return count.
    3. Return count+1.
features: [default-parameters]
includes: [propertyHelper.js]
---*/


function Test() {
    var f1 = (x = 42) => {};

    assert.sameValue(f1.length, 0, 'FormalsList: x = 42');
    verifyNotEnumerable(f1, 'length');
    verifyNotWritable(f1, 'length');

    var f2 = (x = 42, y) => {};

    assert.sameValue(f2.length, 0, 'FormalsList: x = 42, y');
    verifyNotEnumerable(f2, 'length');
    verifyNotWritable(f2, 'length');

    var f3 = (x, y = 42) => {};

    assert.sameValue(f3.length, 1, 'FormalsList: x, y = 42');
    verifyNotEnumerable(f3, 'length');
    verifyNotWritable(f3, 'length');

    var f4 = (x, y = 42, z) => {};

    assert.sameValue(f4.length, 1, 'FormalsList: x, y = 42, z');
    verifyNotEnumerable(f4, 'length');
    verifyNotWritable(f4, 'length');
}

// preheat
const NUMBER_OF_PREHEAT = 1;
for (let i = 0; i < NUMBER_OF_PREHEAT; i++) {
    Test();
}

ArkTools.jitCompileAsync(Test);
assert.sameValue(ArkTools.waitJitCompileFinish(Test), true, '[JIT] JIT disabled.');

// test
const NUMBER_OF_TEST = 1; // or 2
for (let i = 0; i < NUMBER_OF_PREHEAT; i++) {
    Test();
}
